package com.yangrong.basic;

/**
 * 方法参数
 * @author YangRong
 * @date 2020年4月16日
 * <p>Title: ParamTest.java</p>
 */
public class ParamTest {

	public static void main(String[] args) {
		
		/*
		 * 方法不能修改一个基本数据类型的参数（数值型或布尔型）
		 */
		System.out.println("Testing tripleValue");
		double percent = 10;
		System.out.println("Before: percent = " + percent);
		tripleValue(percent);
		System.out.println("After: percent = " + percent);
		
		/*
		 * 方法可以改变一个对象参数的状态
		 */
		System.out.println("\nTesting tripleSalary:");
		Employee harry = new Employee("Harry", 50000);
		System.out.println("Before: salary = " + harry.getSalary());
		tripleSalary(harry);
		System.out.println("After: salary = " + harry.getSalary());
		
		/*
		 * 方法不能让对象参数引用新的对象
		 * Java程序设计语言对对象采用的不是引用调用，实际上，对象引用是按值传递的
		 */
		System.out.println("\nTesting swap");
		Employee a = new Employee("Alice", 70000);
		Employee b = new Employee("Bob", 60000);
		System.out.println("Before: a = " + a.getName());
		System.out.println("Before: b = " + b.getName());
		swap(a, b);
		System.out.println("After: a = " + a.getName());
		System.out.println("After: b = " + b.getName());
	}
	
	public static void tripleValue(double x) {
		x = 3 * x;
		System.out.println("End of method: x = " + x);
	}
	
	public static void tripleSalary(Employee x) {
		x.raiseSalary(200);
		System.out.println("End of method: salary = " + x.getSalary());
	}
	
	public static void swap(Employee x, Employee y) {
		Employee temp = x;
		x = y;
		y = temp;
		System.out.println("End of method: x = " + x.getName());
		System.out.println("End of method: y = " + y.getName());
	}
}

/*
 * 如果编写类时没有编写构造器，系统会提供一个无参数构造器。这个构造器将所有实例域设置为默认值。
 * 数值型 0、布尔型 false、对象变量 null
 * 
 * 勒种提供了至少一个构造器，但是没有提供无参数的构造器，则在构造对象时如果没有提供参数就会被视为不合法。
 * Employee提供了Employee(n,s)有参构造方法
 * 调用 Employee e = new Employee(); 则属于不合法
 * 
 * 仅当类没有提供任何构造器时，系统才会提供一个默认的构造器。如果编写是给出了构造器，要想采用
 * new ClassName()
 * 方式构造实例，就必须提供一个默认的构造器（即无参构造器）。
 */
class Employee {
	private String name;
	private double salary;
	
	public Employee(String n, double s) {
		name = n;
		salary = s;
	}
	
	public String getName() {
		return name;
	}
	
	public double getSalary() {
		return salary;
	}
	
	public void raiseSalary(double byPercent) {
		double raise = salary * byPercent /100;
		salary += raise;
	}
	
}
